package com.cxm.qyyz.base.mvp;

import com.cxm.qyyz.core.DataManager;
import com.cxm.qyyz.core.http.BaseResponse;
import com.cxm.qyyz.core.http.DefaultObserver;
import com.cxm.qyyz.core.http.RxUtil;

import java.util.HashMap;
import java.util.Map;

import javax.inject.Inject;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.schedulers.Schedulers;

/**
 *
 * 2021年12月15日   修改
 * 新增方法  addObservable  统一写中间部分内容简化代码行数
 * 修改人 yzx
 * @param <V>
 */
public class BasePresenter<V extends BaseContract.BaseView> implements BaseContract.BasePresenter<V> {

    @Inject
    protected DataManager dataManager;
    protected V mView;

    @Override
    public void attachView(V view) {
        this.mView = view;
    }

    @Override
    public void detachView() {
        if (mView != null) {
            mView = null;
        }
    }

    /**
     *
     * @param observable       Observable 对象
     * @param defaultObserver  返回调
     * @param <T>              返回值 T 泛型接受
     *
     *           使用示例：
     *           MallFragmentPresenter getBanner 方法
     */
    public <T> void addObservable(Observable<BaseResponse<T>> observable, DefaultObserver<T> defaultObserver ){
        if (null == mView)return;
        observable
                .compose(mView.bindToLife())
                .compose(RxUtil.transformer())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(defaultObserver);
    }
    /**
     *
     * @param observable       Observable 对象
     * @param defaultObserver  返回调
     * @param <T>              返回值 T 泛型接受
     *
     *           使用示例：
     *           MallFragmentPresenter getBanner 方法
     */

    public <T,T1> void addObservable(Observable<BaseResponse<T>> observable, Function<T, Observable<BaseResponse<T1>>> function,
                                      DefaultObserver<T1> defaultObserver ){
        if (null == mView)return;
        observable
                .compose(mView.bindToLife())
                .compose(RxUtil.transformer())
                .subscribeOn(Schedulers.io())
                .map(function)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((Consumer<? super Observable<BaseResponse<T1>>>) defaultObserver);
    }
    /**
     *
     * @param observable       Observable 对象
     * @param defaultObserver  返回调
     * @param <T>              返回值 T 泛型接受
     *
     *           使用示例：
     *           MallFragmentPresenter getBanner 方法
     */

    public <T> void addObservable1(Observable<BaseResponse<T>> observable, Function<T,T> function,
                                      DefaultObserver<T> defaultObserver ){
        if (null == mView)return;
        observable
                .compose(mView.bindToLife())
                .compose(RxUtil.transformer())
                .subscribeOn(Schedulers.io())
                .map(function)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(defaultObserver);
    }

    /**
     * 接口需要参数统一添加
     * date 2021/12/16
     * author yzx
     */
    public Map<String,String> getMap(){
        return new HashMap<String,String>();
    }
}
